/**
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

package pittypat;

import java.lang.reflect.InvocationTargetException;

import pittypat.configuration.ConfigException;
import pittypat.data.DataService;
import pittypat.data.IDataService;

/**
 * 所有功能模块需要继承的抽象类。 一个模块类是一个 Api 类。Api 类的对象实例直接被 Servlet 基础架构创建，其中的功能也被
 * Servlet 调用，不会通过 MVC 等方式首先创建 Controller 等对象。Api 相当于 MVC 中的 Controller。
 */
public abstract class Module {
	private IDataService dataService;

	/**
	 * 初始化 Module 类的新实例。
	 */
	protected Module() {
		this.dataService = null;
	}

	/**
	 * 获取针对当前模块的数据服务。
	 * 并不是所有模块都需要访问数据服务，因此默认情况下，模块不会在内部创建数据服务。只有第一次访问该属性时才会在内部创建IDataService
	 * 对象实例。
	 * 
	 * @throws ConfigException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws ClassNotFoundException
	 */
	protected IDataService getDataService()
			throws ConfigException, ClassNotFoundException, InstantiationException, IllegalAccessException,
			NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		if (this.dataService == null) {
			this.dataService = DataService.find(this.getClass());
		}

		return this.dataService;
	}
}
